//  需求：对已经开发好的项目中的任何一个类，创建实例时，而不是没有创建实例信息，直接打印类的信息
// 打印日志信息
// 输出哪一个类被创建了，并输出了传递了哪些参数信息

// 1.完成日志信息的装饰器
function LoggerInfoDecorator<T extends new (...args: any[]) => any>(
  targetClass: T
) {
  // console.log('日志信息', targetClass.name);
  class LoggerSonClass extends targetClass {
    constructor(...args: any) {
      super(...args);
      console.log('日志信息===', (targetClass as any).name);
    }
    methodone() {
      console.log('methodone== ', this.name);
    }
  }

  return LoggerSonClass;
}

// 2. 目标类
// @LoggerInfoDecorator('我是一个装饰器类')
@LoggerInfoDecorator
class Test {
  name!: string;
  age!: number;

  constructor(name: string) {
    this.name = name;
  }
  eat() {
    console.log(this.name, '吃饭');
  }
}

let test = new Test('wel');
let LoggerSonClass = LoggerInfoDecorator<typeof Test>(Test); //这里的 LoggerInfoDecorator<typeof Test>(Test) 相当于根据类，固定下来，利用工厂函数，返回一个新类，
let LoggerSonClassInstance = new LoggerSonClass('王五');
LoggerSonClassInstance.methodone();
// console.log((test as any).methodone());
